package resources;

import java.io.IOException;
import java.util.StringTokenizer;

public class Hartal {

	public static void main(String[] args) {

		int numberOfTestCases, countNumberOfTestCases, numberOfDaysToSimulation, numberOfPoliticalParties, hartalParameter, numberOfDaysWorkingLose, numberOfDaysWorkingLoseAux;
		int[] hartalParameterArray, numberOfDaysLoseArray;
		StringTokenizer linhaStringTokenizer;
		String linhaDigitada, linhaBuffer;
		StringBuffer sb;
		boolean fim = false;

		countNumberOfTestCases = 0;


		// busca a linha digitada
		linhaDigitada = retornaLinhaDigitada(100);

		// transforma em tokens
		linhaStringTokenizer = new StringTokenizer(linhaDigitada);

		// numero de teste de caso
		numberOfTestCases = Integer.parseInt(linhaStringTokenizer.nextToken());

		sb = new StringBuffer();
		
		for (int j = 0; j < numberOfTestCases; j++) {

			//numberOfDaysToSimulation = 0;
			
			
			//sb = new StringBuffer();
			// busca a linha digitada
			linhaDigitada = retornaLinhaDigitada(100);

			// transforma em tokens
			linhaStringTokenizer = new StringTokenizer(linhaDigitada);

			// numero de dias
			numberOfDaysToSimulation = Integer.parseInt(linhaStringTokenizer
					.nextToken());

			//System.out.println("numberOfDaysToSimulation: "+numberOfDaysToSimulation);
			if (numberOfDaysToSimulation >= 7
					&& numberOfDaysToSimulation <= 3650) {

				// busca a linha digitada
				linhaDigitada = retornaLinhaDigitada(100);

				// transforma em tokens
				linhaStringTokenizer = new StringTokenizer(linhaDigitada);

				// numero de dias
				numberOfPoliticalParties = Integer
						.parseInt(linhaStringTokenizer.nextToken());

				//System.out.println("numberOfPoliticalParties: "+numberOfPoliticalParties);
				if (numberOfPoliticalParties >= 1
						&& numberOfPoliticalParties <= 100) {

					// inicializa array com todos os dias perdidos com zeros
					numberOfDaysLoseArray = new int[numberOfDaysToSimulation];
					for (int i = 0; i < numberOfDaysToSimulation; i++) {
						numberOfDaysLoseArray[i] = 0;
					}

					//System.out.println("numberOfPoliticalParties: "+numberOfPoliticalParties);
					// instancia novo array com o numero de political parties
					hartalParameterArray = new int[numberOfPoliticalParties];
					for (int indexPoliticalParties = 0; indexPoliticalParties < numberOfPoliticalParties; indexPoliticalParties++) {

						// busca a linha digitada
						linhaDigitada = retornaLinhaDigitada(100);

						// transforma em tokens
						linhaStringTokenizer = new StringTokenizer(
								linhaDigitada);

						hartalParameter = Integer.parseInt(linhaStringTokenizer
								.nextToken())-1;

						hartalParameterArray[indexPoliticalParties] = hartalParameter;

						// percorre o array de dias perdidos, incrementando de
						// acordo com o hartalParameter
						if(hartalParameter==1){
							numberOfDaysLoseArray[0] = 1;
						}
						int index = 0;
						for (int i = 0; i < numberOfDaysToSimulation; i++) {
							
							//if(i>0){
								index = i + hartalParameter;
								if(index<numberOfDaysToSimulation){
									numberOfDaysLoseArray[index] = 1;
								}
							//}
							i = index;
						}
						
						/*System.out.println();System.out.println();
						for (int i = 0; i < numberOfDaysToSimulation; i++) {
							System.out.print(numberOfDaysLoseArray[i]+" ");
						}
						System.out.println();*/
						
						//System.out.println("indexPoliticalParties: "+indexPoliticalParties);
					}

					// conta o numero de dias perdidos durante a semana
					numberOfDaysWorkingLoseAux = 0;
					numberOfDaysWorkingLose = 0;
					for (int i = 0; i < numberOfDaysToSimulation; i++) {

						// valor atual do array
						numberOfDaysWorkingLoseAux = numberOfDaysLoseArray[i];

						// se for o primeiro dia
						if (i == 0) {

							// se valor atual do array for maior que zero, entao
							// eh hartal day
							if (numberOfDaysWorkingLoseAux > 0) {
								numberOfDaysWorkingLose++;
							}
						} else {
							// se nao sexta e sabado
							if (!((i % 5 == 0) || (i % 6 == 0))) {

								// se valor atual do array for maior que zero,
								// entao eh hartal day
								if (numberOfDaysWorkingLoseAux > 0) {
									numberOfDaysWorkingLose++;
								}
							}
						}
					}

					if (countNumberOfTestCases > 1) {
						sb.append("\n");
					}
					countNumberOfTestCases++;
					sb.append(numberOfDaysWorkingLose+"\n");
					
					
					fim = true;

				}// validacao political parties
			}// validacao n

		}
		System.out.print(sb.append("\n").toString());
		// }

	}

	/**
	 * Retorna a linha digitada no input.
	 * 
	 * @param tamanhoMaximo
	 * @return
	 */
	static String retornaLinhaDigitada(int tamanhoMaximo) {

		// armazena em um array o input
		byte linha[] = new byte[tamanhoMaximo];
		int indexCaracterNaLinha = 0, caracterDigitado = -1;
		try {
			// enquanto nao atingir o numero max de caracteres
			while (indexCaracterNaLinha < tamanhoMaximo) {

				// armazena o caracter digitado
				caracterDigitado = retornaCaracterDigitado();

				// se for menor que zero ou fim de linha, para de ler
				if ((caracterDigitado < 0) || (caracterDigitado == '\n')) {
					break;
				}

				// armazena o caracter digitado na linha
				linha[indexCaracterNaLinha++] += caracterDigitado;
			}
		} catch (IOException e) {
			return (null);
		}

		// se for caracter invalido, retorna zero
		if ((caracterDigitado < 0) && (indexCaracterNaLinha == 0)) {
			return (null); // eof
		}

		// senao retorna a string lida
		return (new String(linha, 0, indexCaracterNaLinha));
	}

	/**
	 * Retorna o caracter digitado.
	 * 
	 * @return
	 * @throws IOException
	 */
	static int retornaCaracterDigitado() throws IOException {
		return System.in.read();
	}
}
